#include "hal_rate_dis.h"
#include "main.h"
#include "bsp.h"

const uint32_t rate_nor_table[][2] =
{
	{ 0, 		0			},		//时间ms和流量的mL的数据表
	{	10000, 	404 	},
	{ 20000, 	693 	},
	{ 30000, 	803  	},
	{ 40000, 	1450 	},
	{ 50000, 	2011 	},
	{ 60000, 	2184 	},
	{ 70000, 	2600 	},
	{ 80000, 	2770 	},
	{ 90000, 	3154 	},
	{100000, 	3463 	},
	{110000, 	3463 	},
	{1000000,		1		},
};
const uint32_t rate_cool_table[][2] =
{
	{ 0, 		0				},
	{ 10000, 	292 		},
	{ 20000, 	440 		},
	{ 30000, 	779 		},
	{ 40000, 	996 	 	},
	{ 50000, 	1178	 	},
	{ 60000, 	1358	 	},
	{ 70000, 	1545	 	},
	{ 80000, 	1734	 	},
	{ 90000, 	1926	 	},
	{100000, 	2105	 	},
	{110000, 	2105	 	},
	{1000000,		1			},
};
const uint32_t rate_heat_table[][2] =
{
	{ 0, 		0			},
	{ 10000, 	490 	},
	{ 20000, 	967  	},
	{ 30000, 	1463 	},
	{ 40000, 	1940 	},
	{ 50000, 	2317 	},
	{ 60000, 	2587 	},
	{ 70000, 	2587 	},
	{ 80000, 	2587 	},
	{ 90000, 	2587 	},
	{100000, 	2587 	},
	{110000, 	2587 	},
	{1000000,	1			},
};
const uint32_t rate_soda_table[][2] =
{
	{ 0, 		 0},
	{ 10000, 	737 },
	{ 20000, 	737 },
	{ 30000, 	737 },
	{	1000000,	1	},
};
uint32_t OnHalRateValue(uint32_t timeValue, teRATEType Chan)
{
	 uint32_t tmpTdsAdValue, tmpCalu, tmpCalu1,tmpCalu2;

	 uint8_t i;
	 
	 const uint32_t (*rate_table)[2];
	 switch(Chan)
	 {
			case RATE_HEAT_ML://热水流量显示
			{
				rate_table = rate_heat_table;
				break;
			}
			case RATE_COOL_ML://冷水流量显示
			{
				rate_table = rate_cool_table;
				break;
			}
			case RATE_NOR_ML://常温出水
			{
				rate_table = rate_nor_table;
				break;
			}
			case RATE_SODA_ML://苏打出水
			{
				rate_table = rate_soda_table;
				break;
			}
			default:
			break;
	}
	 for( i = 0; rate_table[i+1][0] != 1000000; i++ )
	 {
//		 if( timeValue > rate_table[0][0] )//故障判定
//			{
////				if( tdsADCValue >= TDS_OPEN_ADC )//开路没有标记成故障
////				{
////					// 开路
////					tmpTdsAdValue = 0;
////				}
////				else
////				{
////					tmpTdsAdValue = TDS_MIN_MUL10;
////				}
////				break;
//			}
//			else 
			if((timeValue >=rate_table[i][0]) && (timeValue < rate_table[i+1][0]))
			{
					tmpCalu 			  = 	  rate_table[i+1][0] - rate_table[i][0];/* 计算AD级差值：正常应该为负值，现反过来计算 *///10000
				  uint32_t buf1   =     (uint32_t)rate_table[i+1][1] ; //292
				  uint32_t buf2   =     (uint32_t)rate_table[i][1];		//0
					tmpCalu1 			  = 	  buf1-buf2;/* 计算TDS级差值 */  //292
				
					tmpTdsAdValue   = 	  timeValue - rate_table[i][0] ;/* 计算AD级实际差值：正常应该为负值，现反过来计算 *///9450	9600
				  
				  tmpCalu1      = 	tmpTdsAdValue * tmpCalu1;/*2759400 2803200先乘，然后通过斜率计算出对应值 */   //@7 这里相乘不会超过16位所有没有溢出风险
					tmpCalu2      = 	tmpCalu1 / tmpCalu;//275 280
					tmpTdsAdValue =   tmpCalu2 + rate_table[i][1];/*275  280斜率换算出值后加上基准值 */
					
//					tmpCalu1 			=   tmpCalu1 % tmpCalu;/*9400 3200小数位计算 */
//					tmpCalu1 			=   tmpCalu1 * 10 / tmpCalu;/*9  3小数位计算 */
//					 
//					tmpTdsAdValue = tmpTdsAdValue  + tmpCalu1;/*284 放大10倍后加上小数值 */  //20250328 根据表格这里不需要放大10倍
					break;
			}
	 }
	 
	 if(rate_table[i+1][0] == 1000000)
	{
		// 取最后一个不为最下面值的值
		tmpTdsAdValue = rate_table[i+1][1];	
	}
	return tmpTdsAdValue;
	
}

void hal_rate_test(void)
{
	print_debug("COOL_ML_DIS:%d\r\n",		OnHalRateValue(6585,RATE_NOR_ML));  
	print_debug("HEAT_ML_DIS:%d\r\n",		OnHalRateValue(5000,RATE_NOR_ML));  
	print_debug("NOR_ML_DIS:%d\r\n",		OnHalRateValue(3000,RATE_NOR_ML));  
	print_debug("SODA_ML_DIS:%d\r\n",		OnHalRateValue(3000,RATE_NOR_ML));  

	
}
